package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import model.Factura;
import model.ItemFactura;
import model.Producto;

	

public class AdministradorPersistenciaFactura {
	
	private static AdministradorPersistenciaFactura instancia;
	
	public AdministradorPersistenciaFactura(){
		
	}
	
	/* SINGLETON */
	
	public static AdministradorPersistenciaFactura getInstancia(){
		if(instancia == null){
			instancia = new AdministradorPersistenciaFactura();
		}
		return instancia;
	}
	
	/* DEVUELVE LOS ITEMS DE UNA FACTURA */

	public Collection<ItemFactura> selectItems(int numero) {
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		Collection<ItemFactura> items = null;
		ItemFactura item = null;
		Producto producto = null;
		
		try{
			items = new ArrayList<ItemFactura>();
			String SQL = "SELECT * from itemsFacturas WHERE codigoFactura ="+numero;
			
			ps = con.prepareStatement(SQL);
			rs = ps.executeQuery();
			
			while(rs.next()){
				producto = AdministradorPersistenciaProducto.getInstancia().selectProducto(rs.getInt("codigoProducto"));
				item = new ItemFactura(producto, rs.getInt("cantidad"));
				items.add(item);
				
				
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
		catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Cargar Items: " + e.getMessage());
				System.out.println("Stack Trace al Cargar Items: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
		return items;
		
	}
	
	/* INSERTA FACTURA EN BD */

	public void insertFactura(int numero, String cliente) {

		//Obtener conexion BD 
				Connection con = PoolConnection.getPoolConnection().getConnection();
				
				PreparedStatement ps = null;

				try{
					
					//String SQL = "INSERT INTO facturas (codigoFactura, cliente) VALUES (?,?)";
					String SQL = "INSERT INTO facturas (cliente) VALUES (?)";
					
					ps = con.prepareStatement(SQL);
					
					//ps.setInt(1, numero);
					ps.setString(1, cliente);
					
					ps.execute();
					
					PoolConnection.getPoolConnection().realeaseConnection(con);
					
					
				}
				catch( SQLException e ) 
			      {
						System.out.println("Mensaje Error al Insertar Factura: " + e.getMessage());
						System.out.println("Stack Trace al Insertar Factura: " + e.getStackTrace());
						PoolConnection.getPoolConnection().realeaseConnection(con);
			      }
		
	}
	
	/* INSERTA ITEM FACTURA EN BD */

	public void insertItemFactura(int numero, Producto producto, int cantidad) {
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		PreparedStatement ps = null;
		
		try{
			String SQL = "INSERT INTO itemsFacturas (codigoFactura, codigoProducto, tipoProducto, cantidad) VALUES (?,?,?,?)";
			
			ps = con.prepareStatement(SQL);
			
			ps.setInt(1, numero);
			ps.setInt(2, producto.getCodigo());
			ps.setString(3, producto.getTipo());
			ps.setInt(4, cantidad);
			
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
		catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Item Factura: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Item Factura: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
		
		
	}

	
	/* SELECT FACTURA */
	
	
	public Factura selectFactura(int numeroFactura) {
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		Factura factura = null;
		
		try{
			
			String SQL = "SELECT * from facturas WHERE codigoFactura ="+numeroFactura;
			
			ps = con.prepareStatement(SQL);
			rs = ps.executeQuery();
			
			while(rs.next()){
				
				factura = new Factura(rs.getInt("codigoFactura"),rs.getString("cliente"));
			}
			
		}
		catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Seleccionar Factura: " + e.getMessage());
				System.out.println("Stack Trace al Seleccionar Factura: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);

	      }
		return factura;
	}

	/*DEVUELVE EL ULTIMO NUMERO REGISTRADO EN LA BASE*/
	
	public int getUltimoNumero() {
		//Obtener conexion BD 
				Connection con = PoolConnection.getPoolConnection().getConnection();
				
				PreparedStatement ps = null;
				ResultSet rs = null;
				int numero=0;
				
				try{
					
					String SQL = "SELECT MAX(codigoFactura) as maximo from facturas";
					
					ps = con.prepareStatement(SQL);
					rs = ps.executeQuery();
					
					while(rs.next()){
						
						numero= rs.getInt("maximo");
					}
					
				}
				catch( SQLException e ) 
			      {
						System.out.println("Mensaje Error al Seleccionar ultimo nro factura: " + e.getMessage());
						System.out.println("Stack Trace al Seleccionar ultimo nro factura: " + e.getStackTrace());
						PoolConnection.getPoolConnection().realeaseConnection(con);

			      }
				return numero;
	}
	
	
	
	
	
	
	
	

}
